using System;
using Microsoft.Practices.Prism.Events;
using Microsoft.Practices.Prism.ViewModel;
using Microsoft.Practices.Unity;
using Ausy.Silverlight.Survey.Infrastructure.Common;
using Ausy.Silverlight.Survey.Infrastructure.Events;
using System.Windows.Input;
using Microsoft.Practices.Prism.Commands;

namespace Ausy.Silverlight.Survey.ShellModule.ViewParts
{
    /// <summary>
    /// Cette classe représente le Vue Model pour le Shell
    /// </summary>
    public class ShellViewModel : ViewModel<IShellView>, IShellViewModel
    {
        #region SourceUri Property

        /// <summary>
        /// Property sourceUri
        /// </summary>
        private string sourceUri;

        /// <summary>
        /// Property SourceUri
        /// </summary>
        public string SourceUri
        {
            get { return this.sourceUri; }
            set
            {
                if (this.sourceUri != value)
                {
                    this.sourceUri = value;
                    RaisePropertyChanged(() => this.SourceUri);
                }
            }
        }

        #endregion

        #region NavigatedCommand Command Property

        /// <summary>
        /// Commande de création d'un compte
        /// </summary>
        public ICommand NavigatedCommand { get; private set; }

        #endregion

        #region Constructor

        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        /// <param name="container">Container Unity pour instanciation des type d'objet</param>
        public ShellViewModel(IUnityContainer container)
            : base(container)
        {

        }

        #endregion

        #region Initialize Method

        /// <summary>
        /// Cette méthode permet l'initialisation du ViewModel avant que le DataContext soit affecté à la vue
        /// </summary>
        protected override void Initialize()
        {
            // Initialisation des données
            this.SourceUri = "CreateAccount";

            // Initialisation des commandes
            this.NavigatedCommand = new DelegateCommand<Uri>(uri =>
                {

                });

            // Initialisation à l'évènement de demande de changement de page
            this.eventAggregator.GetEvent<NavigateEvent>().Subscribe(this.OnNavigate);
        }

        #endregion

        #region OnNavigate Method

        /// <summary>
        /// Cette méthode change la page a afficher
        /// </summary>
        /// <param name="args">argument de l'event contenant la nouvelle uri</param>
        public void OnNavigate(NavigateEvent args)
        {
            if (args != null)
            {
                this.SourceUri = args.RedirectUri;
            }
        } 

        #endregion
    }
}
